package com.whenimdrunk;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Notification;
import android.support.v4.app.NotificationCompat;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.Toast;

import com.whenimdrunk.negocio.AcercaDe;
import com.whenimdrunk.negocio.ListaContactos;
import com.whenimdrunk.negocio.PhoneCallReceiver;

public class MainActivity extends Activity implements OnClickListener {

    public static MainActivity aMainModoBloqueado = null;
    public static MainActivity aMainModoDesbloqueado = null;

    private static String MODO = "";

    private static final int REQUEST_CHOOSE_PHONE = 1;

    private static IntentFilter filter = new IntentFilter();
    //private static final String ACTION_OUT = "android.intent.action.PHONE_STATE";
    private static final String ACTION_IN = "android.intent.action.NEW_OUTGOING_CALL";

    private static Button bIniciarBloqueo;
    private static Button bDetenerBloqueo;

    private PhoneCallReceiver callReceiver = new PhoneCallReceiver();

    /*@Override
    protected void onDestroy() {
        super.onDestroy();
    }*/

    /*@Override
    protected void onStop() {
        super.onStop();
    }*/

    /*@Override
    protected void onPause() {
        super.onPause();
        //this.registerReceiver(callReceiver, filter);
    }*/

    @Override
    protected void onStart() {

        super.onStart();

        if("".equalsIgnoreCase(MODO)){
            MODO = getString(R.string.desbloqueado);
        }

        if(MODO.equalsIgnoreCase(getString(R.string.bloqueado))){
            aMainModoBloqueado = this;
            bDetenerBloqueo.setVisibility(View.VISIBLE);
            bIniciarBloqueo.setVisibility(View.GONE);

            /*Animation animation = new TranslateAnimation(
                Animation.ABSOLUTE,0,Animation.ABSOLUTE,200,
                Animation.ABSOLUTE,0,Animation.ABSOLUTE,200);
            animation.setDuration(5000);
            animation.setRepeatMode(Animation.REVERSE);
            animation.setRepeatCount(Animation.INFINITE);
            animation.setFillAfter(false);
            bDetenerBloqueo.startAnimation(animation);*/

        }else if(MODO.equalsIgnoreCase(getString(R.string.desbloqueado))){
            aMainModoDesbloqueado = this;
            bDetenerBloqueo.setVisibility(View.GONE);
            bIniciarBloqueo.setVisibility(View.VISIBLE);
        }

    }

    /**
     * Método que se ejecuta al pulsar sobre el botón atrás
     */
    @Override
    public void onBackPressed() {

        if(MODO.equalsIgnoreCase(getString(R.string.bloqueado))){
            moveTaskToBack(true);
        }else{
            //TODO Que finalice la actividad
            super.onBackPressed();
        }

    }

    /**
     * Método que se ejecuta al crear la actividad
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bIniciarBloqueo = (Button) findViewById(R.id.Bloqueo);
        bIniciarBloqueo.setOnClickListener((View.OnClickListener) this);

        bDetenerBloqueo = (Button) findViewById(R.id.Desbloqueo);
        bDetenerBloqueo.setOnClickListener((View.OnClickListener) this);

        final ObjectAnimator horizontalAnimator = ObjectAnimator.ofInt(
            new ButtonAnimatorHelper(bDetenerBloqueo), "marginLeft", 0, 600);

        horizontalAnimator.setDuration(2000);
        horizontalAnimator.setRepeatCount(ValueAnimator.INFINITE);
        horizontalAnimator.setRepeatMode(ValueAnimator.REVERSE);
        horizontalAnimator.setInterpolator(new LinearInterpolator());

        horizontalAnimator.start();

    }

    /**
     * Helper class for button animation
     */
    private static class ButtonAnimatorHelper {

        final Button mButton;
        /**
         * Default constructor
         * @param button
         */
        public ButtonAnimatorHelper(final Button button) {
            mButton = button;
        }

        public void setMarginLeft(final int margin) {

            final ViewGroup.MarginLayoutParams params =
                (ViewGroup.MarginLayoutParams) mButton.getLayoutParams();

            params.leftMargin = margin;

            mButton.setLayoutParams(params);

        }
    }

    /**
     * Método onclick que añade la acción a ejecutar de los botones
     *
     * @param dialogInterface Botón que se pulsa
     */
    public void onClick(View dialogInterface) {

        if(dialogInterface.getId() == R.id.Bloqueo){

            MODO = getString(R.string.bloqueado);

            //Bloquea llamadas entrantes
            //filter.addAction(ACTION_OUT);
            //Bloquea llamadas salientes
            filter.addAction(ACTION_IN);
            this.registerReceiver(callReceiver, filter);

            //Poner en segundo plano
            moveTaskToBack(true);

            //Mostrar notificación
            mostrarNotificacion(this);

        }else if(dialogInterface.getId() == R.id.Desbloqueo){

            MODO = getString(R.string.desbloqueado);

            if(MODO.equalsIgnoreCase(getString(R.string.desbloqueado)) &&
               (callReceiver!=null && callReceiver.getContadorBloqueos()>0)){
                Toast.makeText(this,
                    "BORRACHUZO HAS INTENTADO LLAMAR A TUS CONTACTOS BLOQUEADOS "
                        + callReceiver.getContadorBloqueos() +
                    " VECES", Toast.LENGTH_SHORT).show();


                //Para poder mostrar las veces que se ha llamado a los contactos esperamos un
                //tiempo antes de finalizar el proceso de bloqueo
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    public void run() {
                    // Actions to do after 5 seconds
                    //Matamos el proceso de bloqueo
                    android.os.Process.killProcess(android.os.Process.myPid());
                    }
                }, 3000);

            }else{

                //Si no ha llamado a los contactos bloqueados matamos el proceso de bloqueo
                //sin esperar
                android.os.Process.killProcess(android.os.Process.myPid());

            }

        }

    }

    /**
     * Método que muestra la notificación cuando se pone en segundo plano
     * la aplicación
     *
     * @param context
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public static void mostrarNotificacion(Context context){

        int NOTIFICATION_ID = 1;
        int YOUR_PI_REQ_CODE = 0;

        Intent notificationIntent = new Intent(context, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context,
                YOUR_PI_REQ_CODE, notificationIntent,
                PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationManager nm =
            (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

        Resources res = context.getResources();
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

        builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
            .setTicker(res.getString(R.string.app_name))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.tituloNotificacion))
            .setContentText(res.getString(R.string.textoNotificacion));
        Notification n = builder.build();

      //Solo funciona apartir de Android 4.1
      /*Notification.Builder builder = new Notification.Builder(context);

        builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
            .setTicker(res.getString(R.string.app_name))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.tituloNotificacion))
            .setContentText(res.getString(R.string.textoNotificacion));
        Notification n = builder.build();*/

        nm.notify(NOTIFICATION_ID, n);

    }

    /**
     * Método que crea el menu de preferencias
     *
     * @param menu
     *
     * @return True mostrar el menu, False no mostrarlo
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        if(MODO.equalsIgnoreCase(getString(R.string.desbloqueado))){

            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.main, menu);

        }else if(MODO.equalsIgnoreCase(getString(R.string.bloqueado))){

            return false;/** true -> el menú no está visible */

        }

        return true;/** true -> el menú ya está visible */

    }

    /**
     * Método para ejecutar las opciones de los botones de preferencias
     *
     * @param item Opción pulsada
     *
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.acercaDe:
                Intent i = new Intent(this, AcercaDe.class);
                startActivity(i);
                break;
            case R.id.config:
                Intent intent = new Intent(this, ListaContactos.class);
                startActivityForResult(intent, REQUEST_CHOOSE_PHONE);
                break;

        }

        return true;
    }

}
